import tensorflow as tf

#随机产生均匀分布的数据
tf.random.set_seed(3)
t = tf.random.uniform([5,5],minval=0,maxval=10,dtype=tf.int32)  #shape=[5,5] min=0 ,max=10
tf.print(t)

#第0行
tf.print(t[0])

#倒数第一行
tf.print(t[-1])

#第1行第3列
tf.print(t[1,3])
tf.print(t[1][3])

#下标为第1行至第3行
tf.print(t[1:4,:])  #下标为1,2,3行
tf.print(tf.slice(t,[1,0],[3,5]))    #slice切分，[1,0]切分的起始左上角位置上的数据9, [3,5]切分的终止右下角位置上的数据2(5实际是4)

#对变量来说，还可以使用索引和切片修改部分元素
x = tf.Variable([[1,2],[3,4]],dtype = tf.float32)
x[1,:].assign(tf.constant([0.0,0.0]))  #将x[1,:],即第二行用[0.0,0.0]赋值
tf.print(x)

# tf.reshape可以改变张量的形状，但是其本质上不会改变张量元素的存储顺序，
# 所以，该操作实际上非常迅速，并且是可逆的。
#产生均匀分布的随机数组：min=0,max=255,shape=[1,3,3,2]
a = tf.random.uniform(shape=[1,3,3,2], minval=0,maxval=255,dtype=tf.int32)
tf.print(a.shape)
tf.print(a)

# 改成 （3,6）形状的张量
b = tf.reshape(a,[3,6])
tf.print(b.shape)
tf.print(b)

# 如果张量在某个维度上只有一个元素，利用tf.squeeze可以消除这个维度。
# 和tf.reshape相似，它本质上不会改变张量元素的存储顺序。
# 张量的各个元素在内存中是线性存储的，其一般规律是，同一层级中的相邻元素的物理地址也相邻。

s = tf.squeeze(a)  #抹去维度=1的维度
tf.print(s.shape)
tf.print(s)

#增加一个维度:expand扩张 ，dim纬度
d = tf.expand_dims(s,axis=0) #在第0维插入长度为1的一个维度
tf.print(d)
tf.print(d.shape)

# tf.transpose可以交换张量的维度，与tf.reshape不同，它会改变张量元素的存储顺序。
# tf.transpose常用于图片存储格式的变换上。

# Batch,Height,Width,Channel
tf.print('----------')
#产生随机的均匀分布数据
a = tf.random.uniform(shape=[100,600,600,4],minval=0,maxval=255,dtype=tf.int32)
tf.print(a.shape)

# 转换成 Channel,Height,Width,Batch
s= tf.transpose(a,perm=[3,1,2,0])   #perm:重新纬度排序
tf.print(s.shape)

# 合并分割
# 合并处理
a = tf.constant([[1.0,2.0],[3.0,4.0]])
b = tf.constant([[5.0,6.0],[7.0,8.0]])
c = tf.constant([[9.0,10.0],[11.0,12.0]])

#拼接:concat
c = tf.concat([a,b,c],axis = 0)   #c.shape=(6,2)
tf.print(c)

#分割：split
tf.print(tf.split(c,3,axis = 0))  #指定分割份数=3，平均分割

tf.print(tf.split(c,[2,2,2],axis = 0)) #指定每份的记录数量分割：split[2,2,2]

#作业：
# 使用tensorflow2.0，完成以下操作
# 创建一个变量，初始值为0
# 使用该变量，计算1-100的求和结果
